package br.com.controlador;

import br.com.modelo.Caixa;
import br.com.modelo.Grupo;
import br.com.modelo.Produto;
import br.com.modelo.Subgrupo;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import util.Biblioteca;
import util.JPAUtil;
import util.JSFUtil;

/**
 *
 * @author gilberto.costa
 */
@ManagedBean
@ViewScoped
public class ProdutoControler implements Serializable {

    private Produto produto;
    private List<Produto> listProdutos = new ArrayList<Produto>();
    private List<Subgrupo> listSubGrupos = new ArrayList<Subgrupo>();
    private String campoBusca;
    //variaveis de controle controle
    private Boolean gtin = false;
    private Boolean codInterno = false;
    private Boolean alterando = false;
    private Integer origemMercadoria;
//    private Boolean produtoJaCadastrado = false;

    @PostConstruct
    public void init() {
        produto = new Produto();
        listProdutos = Produto.retornaProdutos();
        listSubGrupos = Subgrupo.retornaSubgrupos();
    }

    /**
     * @return the campoBusca
     */
    public String getCampoBusca() {
        return campoBusca;
    }

    /**
     * @param campoBusca the campoBusca to set
     */
    public void setCampoBusca(String campoBusca) {
        this.campoBusca = campoBusca;
    }

    public void inicializaObj() {
        alterando = false;
        produto = new Produto();
    }

    public void alterar() {
        alterando = false;
    }

    /**
     * @return the produto
     */
    public Produto getProduto() {
        return produto;
    }

    /**
     * @param produto the produto to set
     */
    public void setProduto(Produto produto) {
        alterando = true;
        if (produto.getCst() != null && produto.getCst().length() > 1) {
            origemMercadoria = Integer.parseInt(produto.getCst().substring(0, 1));
            produto.setCst(produto.getCst().substring(1, 3));
        }
        this.produto = produto;
    }

    /**
     * @return the listProdutos
     */
    public List<Produto> getListProdutos() {
        return listProdutos;
    }

    /**
     * @param listProdutos the listProdutos to set
     */
    public void setListProdutos(List<Produto> listProdutos) {
        this.listProdutos = listProdutos;
    }

    /**
     * @return the listSubGrupos
     */
    public List<Subgrupo> getListSubGrupos() {
        return listSubGrupos;
    }

    /**
     * @param listSubGrupos the listSubGrupos to set
     */
    public void setListSubGrupos(List<Subgrupo> listSubGrupos) {
        this.listSubGrupos = listSubGrupos;
    }

    /**
     * @return the gtin
     */
    public Boolean getGtin() {
        return gtin;
    }

    /**
     * @param gtin the gtin to set
     */
    public void setGtin(Boolean gtin) {
        this.gtin = gtin;
    }

    /**
     * @return the codInterno
     */
    public Boolean getCodInterno() {
        return codInterno;
    }

    /**
     * @param codInterno the codInterno to set
     */
    public void setCodInterno(Boolean codInterno) {
        this.codInterno = codInterno;
    }

    /**
     * @return the alterando
     */
    public Boolean getAlterando() {
        return alterando;
    }

    /**
     * @param alterando the alterando to set
     */
    public void setAlterando(Boolean alterando) {
        this.alterando = alterando;
    }

    public void salvar() {
        try {
            if (produto.getGtin().equals("") && produto.getCodigoInterno().equals("")) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Informe o codigo de barras ou o codigo interno do produto!!", "Mensagem"));
            } else if (produto.getIdUnidadeProduto().getId().toString().equalsIgnoreCase("0")) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Selecione a unidade de medida do produto!!", "Mensagem"));
            } else if (produto.getEcfIcmsSt().toString().equalsIgnoreCase("0")) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Selecione ICMS!!", "Mensagem"));
            } else if (produto.getValorVenda().doubleValue() == 0.00) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "O valor de venda do produto deve ser maior que 0.00", "Mensagem"));
            } else {
                try {
                    produto.setTaxaIcms(new BigDecimal(produto.getEcfIcmsSt()));
                } catch (Exception e) {
                    produto.setTaxaIcms(new BigDecimal(0));
                }
                //se nao foi selecionado nenhum grupo e subgrupo coloco como padrao DIVERSOS
                if (produto.getIdGrupo().getId().toString().equalsIgnoreCase("0")) {
                    Grupo g = Grupo.retornaGruposPorNome("Diversos");
                    if (g != null) {
                        produto.setIdGrupo(g);
                    }
                }
                //cst
                produto.setCst(origemMercadoria + produto.getCst());
                produto.setNome(produto.getDescricao().toUpperCase());
                produto.setDescricaoPdv(produto.getDescricaoPdv().toUpperCase());
                produto.setDescricao(produto.getDescricao().toUpperCase());
                produto.setTipoItemSped("04");
                produto.setCsosn("1900");
                produto.setTotalizadorParcial("04T0700");
                produto.setPafPSt('T');
                produto.setIat('A');
                produto.setIppt('T');
                produto.setDataEstoque(new Date());

                SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");
                String tripa = produto.getGtin()
                        + produto.getDescricao()
                        + produto.getDescricaoPdv()
                        + produto.getQtdEstoque()
                        + formatoData.format(produto.getDataEstoque())
                        + produto.getCst()
                        + produto.getTaxaIcms()
                        + produto.getValorVenda()
                        + "0";
                produto.setHashTripa(Biblioteca.MD5String(tripa));
                produto.setHashIncremento(-1);

                if (produto.getIdSubgrupo().getId().toString().equalsIgnoreCase("0")) {
                    Subgrupo g1 = Subgrupo.retornaSubGruposPorNome("Diversos");
                    if (g1 != null) {
                        produto.setIdSubgrupo(g1);
                    }
                }
                produto.setExcluido('N');
                produto = produto.salvar();
                listProdutos = Produto.retornaProdutos();
                JSFUtil.addMessageSucesso("Produto salvo!!");
                //retornando caixas e salvando nos caixas
                List<Caixa> caixa = CaixaControler.retornaCaixa();
                for (Caixa c : caixa) {
                    Connection con = JPAUtil.conectaBanco(c.getIp());
                    if (con != null) {
                        produto = produto.salvarCaixas(c.getIp());
                        JSFUtil.addMessageSucesso("Transferido para caixa(" + c.getNome() + ")");
                    }
                }
                org.primefaces.context.RequestContext.getCurrentInstance().execute("carDialogProduto.hide();");
            }
        } catch (Exception e) {
            JSFUtil.addMessageErro("Problema ao cadastrar o produto!!" + e);
        }
    }

    public void excluir() {
        try {
            produto.setExcluido('S');
            produto = produto.salvar();
            listProdutos = Produto.retornaProdutos();
            //retornando caixas e salvando nos caixas
            List<Caixa> caixa = CaixaControler.retornaCaixa();
            for (Caixa c : caixa) {
                Connection con = JPAUtil.conectaBanco(c.getIp());
                if (con != null) {
                    produto = produto.salvarCaixas(c.getIp());
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Transferido para caixa(" + c.getNome() + ")", "Mensagem"));
                }
            }
            produto = new Produto();
            org.primefaces.context.RequestContext.getCurrentInstance().execute("carDialogProduto.hide();");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Erro ao excluir produto!!" + e, "Mensagem"));
        }
    }

    public void realizaBusca() {
        listProdutos = Produto.retornaBusca(campoBusca);
    }

    public void populaComboSubgrupo() {
        setListSubGrupos(Subgrupo.retornaSubGrupoProGrupo(produto.getIdGrupo().getId()));
    }

    public void inicializaBusca() {
        campoBusca = new String();
    }

    public void gtinCodInterno() {
        String codInter, gtiin;
        if (!produto.getCodigoInterno().equals("") || !produto.getGtin().equals("")) {
            if (!produto.getCodigoInterno().equals("") && produto.getGtin().equals("")) {
                codInter = produto.getCodigoInterno();
                gtiin = produto.getCodigoInterno();
            } else if (produto.getCodigoInterno().equals("") && !produto.getGtin().equals("")) {
                codInter = produto.getGtin();
                gtiin = produto.getGtin();
            } else {
                codInter = produto.getCodigoInterno();
                gtiin = produto.getGtin();
            }
            System.out.println(gtiin + " - " + codInter);
            Produto p = Produto.retornaProdutoPorGtinOuCodInterno(gtiin, codInter);
            if (p != null) {
                alterando = true;
                produto = p;
            } else {
                alterando = false;
            }
        }
    }

    public void preecheDescricaoPdv() {
        if (produto.getDescricao().length() > 38) {
            produto.setDescricaoPdv(produto.getDescricao().substring(0, 38));
        } else {
            produto.setDescricaoPdv(produto.getDescricao());
        }
    }

    /**
     * @return the origemMercadoria
     */
    public Integer getOrigemMercadoria() {
        return origemMercadoria;
    }

    /**
     * @param origemMercadoria the origemMercadoria to set
     */
    public void setOrigemMercadoria(Integer origemMercadoria) {
        this.origemMercadoria = origemMercadoria;
    }
}
